<?php

use think\Db;
use think\Config;

// 应用公共文件
/*
 * 定义公共返回数据
 * @param int $code 返回代码
 * @param string $msg 返回提示语
 * @param int $refer 返回时的页面操作（0：没有操作；1：当前面刷新；2：返回上一面；3：关闭当前面，并且刷新父窗口,4：跳转连接）
 * */
function return_json($code = 1, $msg = '数据调用失败！', $refer = 0, $url = '/index/Index/index.html')
{
    $data['code'] = $code;
    $data['msg'] = $msg;
    $data['refer'] = $refer;
    if ($refer === 4) {
        $data['url'] = $url;
    }
    return json($data);
}


//加密码算法

function encrypt($data, $key)
{
    $key    =    md5($key);
    $x        =    0;
    $len    =    strlen($data);
    $l        =    strlen($key);
    $char = "";
    $str = "";
    for ($i = 0; $i < $len; $i++)
    {
        if ($x == $l)
        {
            $x = 0;
        }
        $char .= $key{$x};
        $x++;
    }
    for ($i = 0; $i < $len; $i++)
    {
        $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
    }
    return base64_encode($str);
}


//解密算法

function decrypt($data, $key)
{
    $key = md5($key);
    $x = 0;
    $data = base64_decode($data);
    $len = strlen($data);
    $l = strlen($key);
    $char = "";
    $str = "";
    for ($i = 0; $i < $len; $i++)
    {
        if ($x == $l)
        {
            $x = 0;
        }
        $char .= substr($key, $x, 1);
        $x++;
    }
    for ($i = 0; $i < $len; $i++)
    {
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))
        {
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
        }
        else
        {
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    return $str;
}



/*
 * 附件删除
 * @param mixed $file_path 附件路径
 * */
function delFile($file_path = '')
{
    static $root_uploads_path = ROOT_PATH . DS . 'public';

    if (!empty($file_path)) {
        if (is_array($file_path)) {
            foreach ($file_path as $v) {
                $file_v_path = $root_uploads_path . $v;
                if (file_exists($file_v_path)) {
                    @unlink($file_path);
                }
            }
        } else {
            $file_path = $root_uploads_path . $file_path;
            if (file_exists($file_path)) {
                @unlink($file_path);
            }
        }
    } else {
        return return_json(1, '附件路径不能为空');
    }
}

/*无限级分类  组成多维数组
 *
 * @param string $tableName 表名，必须
 * @param int $pid 上级ID
 * @param int $level 分类等级
 *
 * @return array 无限级分类好的数组
 *
 *  */
function infinite_classify($tableName = NULL, $pid = 0, $level = 0)
{
    $pre_id_arr = [];

    $data = Db::name($tableName)->whereNull('delete_time')->order('sort','asc')->order('id','asc')->where('status', 1)->whereNull('delete_time')->where('pid', $pid)->select();

    foreach ($data as $k => $v) {
        $v['level'] = $level;
        $pre_id_arr[$k] = $v;
        $map = infinite_classify($tableName, $v['id'], $level+1);
        if ($map) {
            $pre_id_arr[$k]['children'] = $map;
        }
    }

    return $pre_id_arr;
}

/*
 * 无限级分类 组成一维数组
 * @param mixed $tableName 表名，必须
 * @param int $pid 上级ID
 * @param int $level 分类等级
 *
 * @return array 无限级分类好的数组
 * */
function infinite_classify_1w($tableName = NULL, $pid = 0, $level = 0)
{

    static $pre_id_arr = [];

    if (is_array($tableName) && !is_string($tableName)) {
        $stemp = [];
        foreach ($tableName as $k => $v){
            if ($v['pid'] == $pid){
                $stemp[] = $v;
            }
        }
        $data = $stemp;
    }else{
        $data = Db::name($tableName)->order('sort')->where('status', 1)->whereNull('delete_time')->where('pid', $pid)->select();
    }


    foreach ($data as $k => $v) {
        $v['level'] = $level;
        $pre_id_arr[] = $v;
        infinite_classify_1w($tableName, $v['id'], $level+1);
    }

    return $pre_id_arr;
}

/**
 * 随机生成字符串
 *
 * @param int $length
 *
 * @return null|string
 */
function getRandChar($length = 9)
{
    $str = NULL;
    $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
    $max = strlen($strPol) - 1;

    for ($i = 0; $i < $length; $i++) {
        $str .= $strPol[rand(0, $max)]; //rand($min,$max)生成介于min和max两个数之间的一个随机整数
    }

    return $str;
}

/*
 * 获取数组中的最小和最大值
 * @param array $arr 被取值的数组
 * @param $field 要获取的字段
 *
 * @return array 最小值和最大值
 * */
function getMinAndMaxInArray($arr = null, $field = null) {
    if(empty($arr) || empty($field)) {
        return return_json(1,'参数错误');
    }
    $fieldArr = array();
    foreach($arr as $k => $v) {
        $fieldArr[$k] = floatval($v[$field]);
    }
    sort($fieldArr);
    $resArr = !empty($fieldArr) ? array($fieldArr[0],$fieldArr[count($fieldArr)-1]) : array(10,10);
    unset($fieldArr);
    return $resArr;
}

/*
 * 图片上传路径处理
 * @param mixed $old_img_path 旧的路径(新路径在配置文件中定义)
 *
 * @return boole 成功改名返回true
 * */
function temp_to_uploads($old_img_path = '')
{
    $old_path = substr($old_img_path,1);
    $new_path = substr(str_replace(Config::get('temp_upload_path'),Config::get('upload_path'),$old_img_path),1);

    if (!file_exists(Config::get('upload_path'))){
        @mkdir(Config::get('upload_path'),'0777',true);
    }
    @rename($old_path,$new_path);
   return  '/'.$new_path;
}


//取得页面所有的图片地址
function getImg($content = ''){

    $content = stripslashes ( $content );

    $img_array = array ();

    $preg = '/<img.*?src=[\"|\']?(.*?)[\"|\']?\s.*?>/i';
    preg_match_all ( $preg, $content, $img_array );

// 匹配出来的不重复图片

    $img_array = array_unique ( $img_array [1] );

   return $img_array;
}

/**
 * 修改config的函数
 * @param $new_arr 要修改的配置数组
 * @param $config_name 用config()函数获取的配置数组的下标
 * @param $file_path 要修改的配置文件路径
 * @return bool 返回状态
 */
function setconfig($new_arr,$config_name = null,$file_path = null)
{
    if ( (empty($new_arr) && !is_array($new_arr)) || empty($config_name) || empty($file_path)){
        return false;
    }
    /**
     * 原理就是 打开config配置文件 然后使用正则查找替换 然后在保存文件.
     * 传递的参数为2个数组 前面的为配置 后面的为数值.  正则的匹配为单引号  如果你的是分号 请自行修改为分号
     * $pat[0] = 参数前缀;  例:   default_return_type
    $rep[0] = 要替换的内容;    例:  json
     */

    //判断是否有传入配置文件路径
    $fileurl = $file_path?$file_path:APP_PATH . "config.php";

    //获取到旧的配置文件数组
    $old_arr = config($config_name);
    //比较新数组与旧数组的差集是否有新修改的元素
    $edit_arr = array_diff_assoc($new_arr,$old_arr);
    if (count($edit_arr) == 0) return false;

    $pat = array_keys($edit_arr);
    $rep = array_values($edit_arr);

    if (is_array($pat) and is_array($rep)) {
        for ($i = 0; $i < count($pat); $i++) {
            $pats[$i] = '/\'' . $pat[$i] . '\'(.*?),/';
            $reps[$i] = "'". $pat[$i]. "'". "=>" . "'".$rep[$i] ."',";
        }
        //加载配置文件
        $string = file_get_contents($fileurl);
        $string = preg_replace($pats, $reps, $string); // 正则查找然后替换
        file_put_contents($fileurl, $string); // 写入配置文件
        return true;
    } else {
        return flase;
    }
}